/*
1.STL提供了一个已经封装好的容器：vector，可以理解为可变长数组（会自动扩容的顺序表）
*/
#include<iostream>
#include<vector>
using namespace std;
const int N = 10;
struct node
{
    int a, b;
    string s;
};
//三种方法遍历打印
//加引用，不需要拷贝一份
void print(vector<int> &a)
{
    //使用size遍历
    for(int i = 0; i < a.size(); i ++)
        cout << a[i] << " ";
    cout << endl;

    //使用迭代器遍历，迭代器类型vector<int>::iterator
    for(auto it = a.begin(); it != a.end(); it ++)
        cout << *it << " ";
    cout << endl;

    //使用范围for
    for(auto x : a)
        cout << x << " ";
    cout << endl;
}
//size的使用
//empty:返回顺序表是否为空，（是一个bool类型的返回值）
//如果为空返true,否则返回false
void text_size()
{
    //一维数组
    vector<int> a1(6, 8);
    for(int i = 0; i < a1.size(); i ++)
        cout << a1[i] << " ";
    cout << endl;
    
    //二维数组
    vector<vector<int>> a2(3, vector<int>(4, 5));
    for(int i = 0; i < a2.size(); i ++)
    {
        //这里的a2相当于一个vector<int> a(4, 5)
        for(int j = 0; j < a2.size(); j ++)
        {
            cout << a2[i][j] << " ";
        }
        cout << endl;
    }
}
//begin/end
//begin:返回起始位置的迭代器（左开）
//end:返回终点位置的下一个位置的迭代器（右闭）
void test_it()
{
    vector<int> a(10, 1);
    //迭代器类型为vector<int>::iterator,一般使用auto简化
    for(auto it = a.begin(); it != a.end(); it ++)
    {
        cout << *it << " ";
    }
    cout << endl;
    //使用范围for
    for(auto x : a)
    {
        cout << x << " ";
    }
    cout << endl;
}
//尾部增删元素
void test_io()
{
    vector<int> a;
    //尾插
    a.push_back(1);
    //尾删
    a.pop_back();
}
//front:返回首元素
//back:返回尾元素
void test_fb()
{
    vector<int> a(5);
    for(int i = 0; i < 5; i ++)
    {
        a[i] = i + 1;
    }
    cout << a.front() << " " << a.back() << endl;
}
//resize:修改vector大小
//1.如果大于原始的大小，多出来的位置填上默认值，一般是0
//2.如果小于原始的大小，相当于把原来的元素删除
void test_resize()
{
    vector<int> a(5, 1);
    a.resize(10);
    a.resize(3);
}
//clear清空
void test_clear()
{
    vector<int> a(5, 1);
    a.clear();

}
int main()
{
    //创建vector
    //1.名字为a1的int型可变长数组
    vector<int> a1;
    //2.大小为N，里面的值默认为0
    vector<int> a2(N);
    //3.大小为N的vector数组
    vector<int> a3[N];
    //4.大小为N，初始值为2
    vector<int> a4(N, 2);
    //5.初始化列表的创建方法
    vector<int> a5 = {1, 2, 3, 4, 5};
    //6.也可以存字符串，vector可以存放所有的数据类型
    vector<string> a6;
    //7.可以存结构体
    vector<node> a7;
    //8.二维可变长数组
    vector<vector<int>> a8;
    
    return 0;
}